home *** CD-ROM | disk | FTP | other *** search
- /********************************************************
- * j.c: Personal Journal Management Program
- * Written by Leor Zolman, 1/91
- * Usage:
- * j [<subdir>]
- *
- * What it does:
- * Creates a journal entry and appends it to the
- * appropriate monthly incremental journal file
- * in the JOURN_DIR (DOS) or $HOME/journ (Xenix)
- * directory.
- * If the <subdir> argument is given, then the
- * <subdir> subdirectory (of JOURN_DIR or
- * $HOME/journ) is used instead.
- *
- * Compile:
- * Turbo C[++]:
- * tcc j.c
- * Xenix C:
- * cc j.c
- *******************************************************/
-
- #include <stdio.h>
- #include <time.h>
-
- #define DOS 0 /* 1 for DOS, 0 for Xenix/Unix */
- #define DEBUG 0 /* 1 to debug system() calls */
- #define EPSILON 0 /* using DOS version of Epsilon */
-
- #if DOS
- #include <sys\stat.h>
- #define DIR_DELIM "\\" /* pathlist delimiter */
- #define JOURN_DIR "c:\\etc\\journ" /* master dir */
- #define ED_INVOKE "e %s +3" /* editor invokation */
- #else
- #include <sys/types.h> /* stat.h need this */
- #include <sys/stat.h>
- #include <errno.h>
- char *getenv();
- #define DIR_DELIM "/"
- #define JOURN_DIR "journ"
- #define ED_INVOKE "/usr/bin/e %s"
- #endif
-
- #if DEBUG /* expand DBSYS() to show text */
- #define DBSYS(string) \
- (printf("\nAbout to make sys call: %s\n", string),\
- printf("press return..."), getchar(), system(string))
- #else
- #define DBSYS(string) system(string) /* no debugging */
- #endif
-
- #define JTMP "journ.tmp" /* temp file */
-
- int testdir(char *);
- void abortf(char *, char *);
-
- main(argc, argv, envp)
- int argc;
- char **argv, **envp;
- {
- char j_dir[80]; /* Directory where entry will go */
- char j_tmp[80]; /* temporary file name buffer */
- time_t timer; /* For creating ASCII date string */
- struct tm *tblock;
-
- long nfsize, ofsize; /* For saving file sizes */
- struct stat statbuf; /* open file statistics buffer */
-
- char fname[50]; /* for constructing file names */
- char cmd[100]; /* system command text */
- FILE *fp;
- int i;
-
- printf("Electronic Journal Management System v1.0\n\n");
-
- #if EPSILON && DOS /* If Epsilon running, abort */
- for (; *envp; envp++)
- {
- strcpy(j_dir, *envp);
- if (!strcmp(j_dir, "EPSRUNS=Y"))
- abortf("Epsilon is active. Please exit first.");
- }
- #endif
-
- #if DOS
- strcpy(j_dir, JOURN_DIR); /* construct directory name */
- #else
- sprintf(j_dir, "%s/%s", getenv("HOME"), JOURN_DIR);
- #if DEBUG
- printf("j_dir set to: %s\n", j_dir);
- #endif
- #endif
-
- testdir(j_dir); /* check for/create master dir */
-
- if (argc == 2) /* subdir specified? */
- {
- strcat(j_dir, DIR_DELIM); /* yes, append name */
- strcat(j_dir,argv[1]); /* to master directory name */
- testdir(j_dir); /* test for/create subdirectory */
- }
-
- printf("\nStarting up your text editor ");
- printf("on a new journal entry...\n");
-
- sprintf(j_tmp, "%s%s%s", j_dir, DIR_DELIM, JTMP);
-
- if ((fp = fopen(j_tmp, "w")) == NULL)
- abortf("Can't create %s\n", j_tmp);
-
- timer = time(NULL); /* get ASCII time/date string */
- tblock = localtime(&timer);
- fprintf(fp, "\n\t\t\t\t\t\t%s", asctime(tblock));
-
- fflush(fp); /* so fstat works */
- fstat(fileno(fp), &statbuf); /* get file stats */
- ofsize = statbuf.st_size; /* save file length */
- fclose(fp);
-
- sprintf(cmd, ED_INVOKE, j_tmp); /* construct sys call */
- if (DBSYS(cmd)) /* edit the temp file */
- abortf("Error invoking editor.", NULL);
- printf("\n");
-
- if ((fp = fopen(j_tmp, "r")) == NULL) /* can't happen... */
- abortf("Error: %s has disappeared! Aborting.\n", j_tmp);
-
- /* Check if the temp file was modified: */
- fstat(fileno(fp), &statbuf); /* stat the updated file */
- nfsize = statbuf.st_size; /* get new file size */
- fclose(fp);
- if (nfsize == ofsize) /* size unchanged? */
- {
- unlink(j_tmp);
- abortf("You didn't make any changes. Ignored.\n", NULL);
- }
-
- printf("\n");
- /* construct name of journal file */
- sprintf(fname, "%s%s%02d-%02d.txt", j_dir, DIR_DELIM,
- tblock->tm_year % 100, tblock->tm_mon + 1);
-
- /* update journal file */
- sprintf(cmd, "cat %s >> %s", j_tmp, fname);
- DBSYS(cmd);
- unlink(j_tmp);
- printf("\nEntry appended onto journal file %s\n", fname);
- exit(0);
- }
-
- /*
- * Test for existence of the named directory, and create
- * if necessary (pending user's approval):
- */
-
- int testdir(dirname)
- char *dirname;
- {
- char cmd[100]; /* system command text */
- char str[80];
- struct stat statbuf; /* open file statistics buffer */
-
- if (stat(dirname, &statbuf) != 0) /* if doesn't exist */
- ; /* then prompt for creation */
- else if (statbuf.st_mode & S_IFDIR)
- return; /* if directory, no problem */
- else /* exists, but not a directory... */
- abortf("%s exists, but isn't a directory!\n", dirname);
-
- /* ask user if he wants to create the dir */
- printf("Create new directory '%s' (y/n)? ", dirname);
- if (tolower(*gets(str)) == 'n')
- abortf("Program over.\n", NULL);
-
- sprintf(cmd, "mkdir %s", dirname);
- if (DBSYS(cmd))
- abortf("Error creating directory.\n", NULL);
- }
-
- void abortf(fmt, arg)
- char *fmt, *arg;
- {
- printf(fmt, arg);
- exit(1);
- }
-